
if exists (select 1 from sysobjects where name = 'set_dienstplan' and type = 'P')
begin
   drop procedure set_dienstplan
   print 'Procedure: set_dienstplan deleted ...'
end
go
create procedure set_dienstplan(
   @planid         int  = 1,
   @prsid          int  = 1,
   @datum          char(8) = '20070501',
   @abteilungid    int  = 1,
   @dienstid       int  = 1,
   @stunden        decimal(5,2) = 0.0
)
as
begin
  set nocount on

declare @ferien   decimal(5,2)
declare @arbeitsstunden decimal(5,2)
declare @typ int

select @typ = Typ from Dienst where DienstID = @dienstid

  if @typ = 2 --Ferien
   begin
    select @ferien = (select Ferien from Arbeitszeit where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid) + @stunden
    select @arbeitsstunden = (select Haben from Arbeitszeit where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid)
   end

  else
   begin
    select @ferien = (select Ferien from Arbeitszeit where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid)
    select @arbeitsstunden = (select Haben from Arbeitszeit where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid) + @stunden
  end

  insert into Dienstplan (PlanID, PrsID, Datum, AbteilungID, DienstID) values (@planid, @prsid, @datum, @abteilungid, @dienstid)

  declare @pensum decimal(5,2)
  declare @arbeitstage decimal(5,2)
  declare @stundenprotag decimal(5,2)
  declare @soll decimal(5,2)

   select @pensum = isnull(nullif(pa.Prozent,0) ,isnull(a.Prozent,100))
     from Arbeitspensum a,
          PersonalAbteilung pa
    where pa.AbteilungID = @abteilungid
      and a.PrsID = @prsid
      and a.Von <= @datum 
      and a.Bis > @datum
      and pa.PrsId = a.PrsID
      and pa.Von <= @datum
      and pa.Bis > @datum

   if @pensum is null
            select @pensum = 100

  select @arbeitstage = Tage from ArbeitsTage at
   inner join PlanungsJahr pj
      on pj.JahrID = at.JahrID
     and @datum between pj.von and pj.bis
   inner join ArbeitsPlan ap
      on ap.ATID = at.ATID
   where ap.PlanID = @planid

  select @stundenprotag = stundenprotag from Abteilung where AbteilungID = @abteilungid

  select @soll = ((@arbeitstage * @pensum)/100) * @stundenprotag


  if exists (select 1 from Arbeitszeit where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid)
   begin
    update Arbeitszeit set Soll = isnull(@soll,0),--0,
           Haben = isnull(@arbeitsstunden,0),
           Ferien = isnull(@ferien,0)
     where PrsID = @prsid and PlanID = @planid and AbteilungID = @abteilungid
   end
  else
   begin
    insert into Arbeitszeit (PrsID,PlanID,AbteilungID,Soll,Haben,Ferien) values (@prsid, @planid, @abteilungid, /*0*/isnull(@soll,0),0,0)
  end

end
go
print 'Procedure: set_dienstplan done ...'
go
grant exec on set_dienstplan to prsadmins with grant option
go
grant exec on set_dienstplan to prsusers
go

